package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Time;
import java.util.ArrayList;

import mx.ipn.to.FechaHoraTO;
import mx.ipn.persistencia.dao.TurnoDAO;
import mx.ipn.to.TurnoTO;

public class TurnoDAOMySQL implements TurnoDAO{
	static{FabricaDeDAOsMySQL.iniciaLog(TurnoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO turno (nombre,hora_inicio,duracion,tiempo_descanso,dias_semana,activo) VALUES(?,?,?,?,?,?)";
	private static final String ACTIVARDESACTIVAR = "UPDATE turno SET activo=? WHERE id_turno=?";
	private static final String DELETE = "DELETE FROM turno WHERE id_turno=?";
	private static final String UPDATE = "UPDATE turno SET nombre=?,hora_inicio=?,duracion=?,tiempo_descanso=?,dias_semana=?,activo=? WHERE id_turno=?";
	private static final String FINDBYID = "SELECT * FROM turno WHERE id_turno=?";
	private static final String FINDBYNOM = "SELECT * FROM turno WHERE UPPER(REPLACE(nombre,' ',''))=UPPER(REPLACE(?,' ','')) and activo=true";
	private static final String SELECTDIAS = "SELECT * FROM turno WHERE dias_semana=?";
	private static final String SELECTRANGOHORARIO = "SELECT * FROM turno WHERE hora_inicio>=? and hora_inicio<= ? AND activo=true";
	private static final String SELECTRANGODIAS = "SELECT * FROM turno WHERE dias_semana>=? and dias_semana<=? AND activo=true";
	private static final String SELECTRANGODURACION = "SELECT * FROM turno WHERE duracion>=? AND duracion<=? AND activo=true";
	private static final String SELECT = "SELECT * FROM turno WHERE activo=true";
	@Override
	public short deleteTurno(int idTurno) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idTurno);

			ps.executeUpdate();
			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short)-1;
		}
	}
	@Override
	public ArrayList<TurnoTO> selectTurnoByDias(short dias) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTDIAS);

			ps.setShort(1, dias);

			ResultSet rs = ps.executeQuery();

			ArrayList<TurnoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<TurnoTO>();
				
				int idTurno = rs.getInt("id_turno");
				String nombre = rs.getString("nombre");
				java.sql.Time horaInicio = rs.getTime("hora_inicio");
				java.sql.Time duracion = rs.getTime("duracion");
				java.sql.Time tiempoDescanso = rs.getTime("tiempo_descanso");
				short diasSemana = rs.getShort("dias_semana");
				boolean activo = rs.getBoolean("activo");
				
				TurnoTO turnoTO = new TurnoTO(idTurno, nombre,horaInicio,duracion,tiempoDescanso,diasSemana,activo);

				coleccion.add(turnoTO);
			}
				ps.close();
				conexion.close();
				return coleccion;
		} 
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public ArrayList<TurnoTO> selectTurnoByRangoDuracion(Time inicioDuracion,Time finDuracion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTRANGODURACION);

			ps.setTime(1, inicioDuracion);
			ps.setTime(2, finDuracion);

			ResultSet rs = ps.executeQuery();

			ArrayList<TurnoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<TurnoTO>();
				
				int idTurno = rs.getInt("id_turno");
				String nombre = rs.getString("nombre");
				java.sql.Time horaInicio = rs.getTime("hora_inicio");
				java.sql.Time tiempoDescanso = rs.getTime("tiempo_descanso");
				java.sql.Time duracion = rs.getTime("duracion");
				short diasSemana = rs.getShort("dias_semana");
				boolean activo = rs.getBoolean("activo");
				
				TurnoTO turnoTO = new TurnoTO(idTurno, nombre,horaInicio,duracion,tiempoDescanso,diasSemana,activo);

				coleccion.add(turnoTO);
			}
				ps.close();
				conexion.close();
				return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public TurnoTO findTurnoById(int idTurno) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idTurno);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				
				String nombre = rs.getString("nombre");
				java.sql.Time horaInicio = rs.getTime("hora_inicio");
				java.sql.Time duracion = rs.getTime("duracion");
				java.sql.Time tiempoDescanso = rs.getTime("tiempo_descanso");
				short diasSemana = rs.getShort("dias_semana");
				boolean activo = rs.getBoolean("activo");
				
				TurnoTO turnoTO = new TurnoTO(idTurno, nombre,horaInicio,duracion,tiempoDescanso,diasSemana,activo);
				ps.close();
				conexion.close();
				return turnoTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public TurnoTO findTurnoByNombre(String nombre) {
		TurnoTO turnoTO = null;
		try {
			
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYNOM);

			ps.setString(1, nombre);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				
				int idTurno = rs.getInt("id_turno");
				java.sql.Time horaInicio = rs.getTime("hora_inicio");
				java.sql.Time duracion = rs.getTime("duracion");
				java.sql.Time tiempoDescanso = rs.getTime("tiempo_descanso");
				short diasSemana = rs.getShort("dias_semana");
				boolean activo = rs.getBoolean("activo");
				
				turnoTO = new TurnoTO(idTurno, nombre,horaInicio,duracion,tiempoDescanso,diasSemana,activo);
				ps.close();
				conexion.close();
				return turnoTO;
			}
			ps.close();
			conexion.close();
			return turnoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return turnoTO;
		}
	}
	@Override
	public ArrayList<TurnoTO> selectTurnoByRangoDias(short inicio,short fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTRANGODIAS);

			ps.setShort(1, inicio);
			ps.setShort(2, fin);

			ResultSet rs = ps.executeQuery();

			ArrayList<TurnoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<TurnoTO>();
				
				int idTurno = rs.getInt("id_turno");
				String nombre = rs.getString("nombre");
				java.sql.Time horaInicio = rs.getTime("hora_inicio");
				java.sql.Time duracion = rs.getTime("duracion");
				java.sql.Time tiempoDescanso = rs.getTime("tiempo_descanso");
				short diasSemana = rs.getShort("dias_semana");
				boolean activo = rs.getBoolean("activo");
				
				TurnoTO turnoTO = new TurnoTO(idTurno, nombre,horaInicio,duracion,tiempoDescanso,diasSemana,activo);

				coleccion.add(turnoTO);
			}
				ps.close();
				conexion.close();
				return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public ArrayList<TurnoTO> selectTurnoByRangoHorario(Time inicio, Time fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTRANGOHORARIO);

			ps.setTime(1, inicio);
			ps.setTime(2, fin);

			ResultSet rs = ps.executeQuery();
			ArrayList<TurnoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<TurnoTO>();
				
				int idTurno = rs.getInt("id_turno");
				String nombre = rs.getString("nombre");
				java.sql.Time horaInicio = rs.getTime("hora_inicio");
				java.sql.Time duracion = rs.getTime("duracion");
				java.sql.Time tiempoDescanso = rs.getTime("tiempo_descanso");
				short diasSemana = rs.getShort("dias_semana");
				boolean activo = rs.getBoolean("activo");
				
				TurnoTO turnoTO = new TurnoTO(idTurno, nombre,horaInicio,duracion,tiempoDescanso,diasSemana,activo);

				coleccion.add(turnoTO);
			}
				ps.close();
				conexion.close();
				return coleccion;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public boolean insertTurno(TurnoTO turnoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, turnoTO.getNombre());
			ps.setTime(2, FechaHoraTO.getHora(turnoTO.getHoraInicio()));
			ps.setTime(3, FechaHoraTO.getHora(turnoTO.getDuracion()));
			ps.setTime(4, FechaHoraTO.getHora(turnoTO.getTiempoDescanso()));
			ps.setShort(5, turnoTO.getDiasSemana());
			ps.setBoolean(6, turnoTO.getActivo());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	@Override
	public ArrayList<TurnoTO> selectTurno() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			ArrayList<TurnoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<TurnoTO>();
				
				int idTurno = rs.getInt("id_turno");
				String nombre = rs.getString("nombre");
				java.sql.Time horaInicio = rs.getTime("hora_inicio");
				java.sql.Time duracion = rs.getTime("duracion");
				java.sql.Time tiempoDescanso = rs.getTime("tiempo_descanso");
				short diasSemana = rs.getShort("dias_semana");
				boolean activo = rs.getBoolean("activo");
				
				TurnoTO turnoTO = new TurnoTO(idTurno, nombre,horaInicio,duracion,tiempoDescanso,diasSemana,activo);

				coleccion.add(turnoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public short updateTurno(TurnoTO turnoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setString(1, turnoTO.getNombre());
			ps.setTime(2, FechaHoraTO.getHora(turnoTO.getHoraInicio()));
			ps.setTime(3, FechaHoraTO.getHora(turnoTO.getDuracion()));
			ps.setTime(4, FechaHoraTO.getHora(turnoTO.getTiempoDescanso()));
			ps.setShort(5, turnoTO.getDiasSemana());
			ps.setBoolean(6, turnoTO.getActivo());
			
			ps.setInt(7, turnoTO.getIdTurno());
			

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short)-1;
		}
	}
	@Override
	public short activarDesactivarTurno(/*TurnoTO turnoTO*/int idTurno,boolean activo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(ACTIVARDESACTIVAR);

			ps.setBoolean(1, activo);
			
			ps.setInt(2, idTurno);
			

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short)-1;
		}
	}
	
	
}
